package com.itany.nmms.service.impl;

import com.itany.mvc.util.CommonsMultipartFile;
import com.itany.nmms.constant.DictConstant;
import com.itany.nmms.dao.ProductMapper;
import com.itany.nmms.dao.SequenceMapper;
import com.itany.nmms.entity.Product;
import com.itany.nmms.entity.ProductExample;
import com.itany.nmms.entity.Sequence;
import com.itany.nmms.entity.SequenceExample;
import com.itany.nmms.exception.FileUploadErrorException;
import com.itany.nmms.exception.ProductExistException;
import com.itany.nmms.exception.RequestParameterErrorException;
import com.itany.nmms.factory.ObjectFactory;
import com.itany.nmms.service.ProductService;
import com.itany.nmms.util.ParameterUtil;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/4/29 10:30
 * Version:1.0-SNAPSHOT
 * Description:
 */
public class ProductServiceImpl implements ProductService {
    @Override
    public void addProduct(String name, String price, List<CommonsMultipartFile> files, String typeId, HttpSession session) throws RequestParameterErrorException, ProductExistException, FileUploadErrorException {
        ProductMapper productMapper = (ProductMapper) ObjectFactory.getObject("productMapper");
        SequenceMapper sequenceMapper = (SequenceMapper) ObjectFactory.getObject("sequenceMapper");
        if(ParameterUtil.isNull(name) || ParameterUtil.isNull(price) || files.isEmpty() || ParameterUtil.isNull(typeId)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 当前属于单文件上传
        // 因此,当前的集合中有且仅有一个文件
        CommonsMultipartFile file = files.get(0);
        if(file.isEmpty()){
            throw new RequestParameterErrorException("上传的文件不能为空");
        }

        // 判断当前的商品是否已经存在
        // 根据类型与名称进行查询
        ProductExample productExample = new ProductExample();
        productExample.or()
                .andNameEqualTo(name)
                .andProductTypeIdEqualTo(Integer.parseInt(typeId));
        List<Product> products = productMapper.selectByExample(productExample);
        if(!products.isEmpty()){
            throw new ProductExistException("该商品已经存在");
        }

        // 准备添加商品
        Product product = new Product();
        product.setName(name);
        product.setPrice(Double.parseDouble(price));
        product.setProductTypeId(Integer.parseInt(typeId));

        // 生成商品编号
        // 判断当前是否已经生成过商品编号
        // 根据商品编号的前缀查询对应的序列号信息
        SequenceExample example = new SequenceExample();
        example.or()
                .andNameEqualTo(DictConstant.PRODUCT_NO_PREFIX);
        List<Sequence> sequences = sequenceMapper.selectByExample(example);
        if(sequences.isEmpty()){
            // 如果没有查询到对应的数据,则表示尚未生成过
            // 创建一个初始数据
            Sequence sequence = new Sequence();
            sequence.setName(DictConstant.PRODUCT_NO_PREFIX);
            sequence.setValue(DictConstant.PRODUCT_NO_SEQUENCE_INIT_VALUE);
            // 执行添加操作
            sequenceMapper.insertSelective(sequence);

            // 生成与之对应的商品编号
            product.setProductNo(DictConstant.PRODUCT_NO_PREFIX+new SimpleDateFormat("yyyyMMdd").format(new Date())+sequence.getValue());
        } else{
            // 如果查询到对应的数据,则表示已经生成过
            // 此时查询到的数据有且仅有一条
            // 取出这一条数据
            Sequence sequence = sequences.get(0);
            // 判断当前序列号的值是否达到了最大值
            if(DictConstant.PRODUCT_NO_SEQUENCE_MAX_VALUE.equals(sequence.getValue())){
                // 如果达到了最大值,则下一个序列号的值为初始值
                sequence.setValue(DictConstant.PRODUCT_NO_SEQUENCE_INIT_VALUE);
            }else{
                // 如果尚未达到最大值,则下一个值为当前值的基础+1,且保持格式不变
                sequence.setValue(ParameterUtil.nextValue(sequence.getValue()));
            }
            // 执行修改操作
            sequenceMapper.updateByPrimaryKeySelective(sequence);

            // 生成与之对应的商品编号
            product.setProductNo(DictConstant.PRODUCT_NO_PREFIX+new SimpleDateFormat("yyyyMMdd").format(new Date())+sequence.getValue());
        }

        // 上传商品图片
        // 获取相对于服务器的路径,用于保存到数据库
        String path = DictConstant.PRODUCT_IMAGE_ROOT_FOLDER+new SimpleDateFormat("yyyyMMdd").format(new Date());
        // 获取绝对路径
        String cp = session.getServletContext().getRealPath(path);

        // 创建指定路径的目录
        File f = new File(cp);
        f.mkdirs();

        String fileName = file.getOriginalFilename();
        // 为上传的文件名取一个别名,在原有名字末尾加上毫秒数,防止重复
        fileName = fileName.substring(0,fileName.lastIndexOf("."))+"-"+new Date().getTime()+fileName.substring(fileName.lastIndexOf("."));

        // 设置商品图片的值,路径名+文件名
        product.setImage(path+"/"+fileName);

        try {
            // 添加商品信息
            productMapper.insertSelective(product);

            // 开始上传
            file.transferTo(new File(cp,fileName));
        } catch (Exception e) {
            e.printStackTrace();
            throw new FileUploadErrorException("图片上传出错");
        }

    }
}
